package com.lsismo.core.base.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;

import com.lsismo.core.base.util.PageBean;

/**
 * 泛型Manager,调用GenericDao实现CRUD
 *
 * <p>如果不想进行强制类型转换，继承该类实现自己的Manager
 *
 * @param <T> 类型变量
 * @param <PK> 主键
 */
public interface GenericManager<T, PK extends Serializable> {

	/**
	 * 由于特殊处理需要，该方法返回hibernate的数据库操作基类
	 * @return
	 */
	Session getCurrentSession();
	
    /**
     * 或的所有的对象
     * @return 对象列表
     */
    List<T> getAll() throws Exception;
    
    /**
     * 根据Hql语句更新对象
     * 
     * @return 更新的对象数
     */
    int bulkUpdate(String hql ,Object ... value) throws Exception;

    /**
     * 通过唯一标志符获得对象，如果找不到抛出运行时异常ObjectRetrievalFailureException
     *
     * @param id 要获取对象的唯一标志符
     * @return 得到的对象
     * @see org.springframework.orm.ObjectRetrievalFailureException
     */
    T get(PK id);

    /**
     * 通过id检查对象是否存在
     * @param id 要获取对象的唯一标志符
     * @return - 存在返回true，不存在返回false
     */
    boolean exists(PK id);

    /**
     * 保存对象 - 用于update和insert操作
     * @param object 要保存的对象
     * @return 更新后的对象
     */
    T save(T object);

    /**
     * 通过ID删除对象
     * @param id 要删除对象的唯一标志符
     */
    void remove(PK id);
    
    
    /**
     * 该方法用于基于实例删除对象
     * @param object 要删除对象
     */
    void remove(T object);
    
    /**
     * 该方法用于批量删除(但不会发生级联删除)
     * @param ids
     * @param idName
     */
    void remove(PK ids , String idName);
    
    /**
     * 该方法用于基于id批量删除对象
     * @param ids 要删除的对象的id数组
     */
    void bulkRemove(final PK[] ids);
    
    /**
     * 该方法用于依据给定的实例查找对象
     * @param object
     * @return 符合条件的对象List
     */
    List<T> findByExample(T object);
    
    /**
     * 该方法用语依据给定的属性查询
     * @param propertyName
     * @param value
     * @return
     */
    List<T> findByProperty(String propertyName, Object value);
    
    /**
     * 该方法用语按照给定的HQL语句查询
     * @param hql hql语句
     * @param values 数量可变的参数
     * @return
     */
    List<T> find(String hql, Object... values);
  
    /**
     * 该方法获取所有对象列表，对象没有重复.
     * <p>注意，如果要使用该方法，model必须要正确地实现了hashcode和equals两个方法</p>
     * @return 对象列表
     */
    List<T> getAllDistinct();
	
	/**
     * 通过已命名的查询查询
     * @param queryName 已命名的查询的名称
     * @param queryParams 查询名值对
     * @return 找到的结果列表
     */
    List<T> findByNamedQuery(String queryName, Map<String, Object> queryParams) throws Exception;
    /**
     * 分页获取对象列表
     * @param hql 
     * @param first 开始记录数
     * @param max 显示记录数
     * @return
     * @throws Exception
     */
    List<T> findPageAll(final String hql,final int first,final int max) throws Exception;
    /**
     * 分页获取对象列表
     * @param pageBean 分页包装类
     * @throws Exception
     */
    void findPageAll(PageBean pageBean) throws Exception;
    /**
     * 获取对象总记录数
     * @param hqlQuery
     * @return
     * @throws Exception
     */
    int getInfosCount(String hqlQuery)throws Exception;
    
    Object commonFindById(Class clazz,PK id);

}
